c语言实现图的深度优先遍历和广度优先遍历


//代码可直接运行
#include <stdio.h>
#include <stdlib.h>

#define maxsize 100

typedef struct ArcNode {
    int num;
    struct ArcNode *next;
}ArcNode;
typedef struct VNode{
    ArcNode *firstarc;
}VNode;
typedef struct Graph {
    VNode VNodeList[maxsize];
    int n,e;
}Graph;

void bulidGraph(Graph *&g);

int visitdfs[maxsize];
void DFS(Graph *g ,int v);
void dfs(Graph *g);

int visit[maxsize];
void bfs(Graph *g);
void BFS(Graph *g ,int v);

int main()
{
    Graph *g;
    g=(Graph *) malloc(sizeof(Graph));
    bulidGraph(g);

    dfs(g);
    printf("\n");
    bfs(g);
    return 0;
}

void DFS(Graph *g ,int v){
    ArcNode *p=g->VNodeList[v].firstarc;
    visitdfs[v]=1;
    printf("%d",v);
    while (p!=NULL){
        if(visitdfs[p->num]==0)
        DFS(g,p->num);
        p=p->next;
    }
}
void dfs(Graph *g){
    for(int i=0;i<g->n;i++){
        if(visitdfs[i]==0)
            DFS(g,i);
    }
}

void BFS(Graph *g,int v){
    ArcNode *p ;
    int que [maxsize], top=0,rear=0;
    int j;
    printf("%d",v);
    visit[v]=1;
    rear =(rear+1)%maxsize;
    que[rear]=v;
    while(top!=rear){
        top =(top+1)%maxsize;
        j=que[top];
        p=g->VNodeList[j].firstarc;
        while (p!=NULL){
            if(visit[p->num]==0){
                printf("%d",p->num);
                visit[p->num]=1;
                rear=(rear+1)%maxsize;
                que[rear]=p->num;

                }
                p=p->next;
        }
    }
}
void bfs(Graph *g){
    for(int i=0;i<g->n;i++){
        if(visit[i]==0)
            BFS(g,i);
    }
}

void bulidGraph(Graph *&g){
    g->n=6;
    g->e=7;

    VNode v0,v1 ,v2, v3 ,v4 ,v5,v6;
    ArcNode *v01,*v03,*v04,*v14,*v12,*v20,*v32,*v56;

    v01=(ArcNode *) malloc(sizeof(ArcNode));
    v01->num=1;
    v03=(ArcNode *) malloc(sizeof(ArcNode));
    v03->num=3;
    v04=(ArcNode *) malloc(sizeof(ArcNode));
    v04->num=4;
    v14=(ArcNode *) malloc(sizeof(ArcNode));
    v14->num=4;
    v12=(ArcNode *) malloc(sizeof(ArcNode));
    v12->num=2;
    v20=(ArcNode *) malloc(sizeof(ArcNode));
    v20->num=0;
    v32=(ArcNode *) malloc(sizeof(ArcNode));
    v32->num=2;
    v56=(ArcNode *) malloc(sizeof(ArcNode));
    v56->num=6;

    v0.firstarc=v01;
    v1.firstarc=v14;
    v2.firstarc=v20;
    v3.firstarc=v32;
    v4.firstarc=NULL;
    v5.firstarc=v56;
    v6.firstarc=NULL;

    v01->next=v03;
    v03->next=v04;
    v14->next=v12;
    v32->next=NULL;
    v20->next=NULL;
    v12->next=NULL;
    v04->next=NULL;
    v56->next=NULL;

    g->VNodeList[0]=v0;
    g->VNodeList[1]=v1;
    g->VNodeList[2]=v2;
    g->VNodeList[3]=v3;
    g->VNodeList[4]=v4;
    g->VNodeList[5]=v5;
    g->VNodeList[6]=v6;

}

  • 27
    点赞
  • 124
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
以下是C语言实现深度优先遍历广度优先遍历的代码示例: 深度优先遍历: ```c #define MAX 100 int visited[MAX] = {0}; // 全局数组,用于标记节点是否被访问过 // 深度优先遍历算法 void DFS(AdjGraph *G, int v) { ArcNode *p; visited[v] = 1; // 标记节点v已被访问 printf("%d ", v); // 输出被访问的节点编号 p = G->adjlist[v].firstarc; while (p != NULL) { if (visited[p->adjvex] == 0) { // 若节点未被访问,则递归访问它 DFS(G, p->adjvex); } p = p->nextarc; } } // 深度优先遍历入口函数 void DFSTraverse(AdjGraph *G) { int i; for (i = 0; i < G->n; i++) { visited[i] = 0; // 初始化visited数组 } for (i = 0; i < G->n; i++) { if (visited[i] == 0) { // 若节点未被访问,则从该节点开始进行深度优先遍历 DFS(G, i); } } } ``` 广度优先遍历: ```c #define MAX 100 int visited[MAX] = {0}; // 全局数组,用于标记节点是否被访问过 // 广度优先遍历算法 void BFS(AdjGraph *G, int v) { int queue[MAX], front = 0, rear = 0; // 定义队列 ArcNode *p; visited[v] = 1; // 标记节点v已被访问 printf("%d ", v); // 输出被访问的节点编号 rear = (rear + 1) % MAX; queue[rear] = v; // 将节点v入队 while (front != rear) { // 队列不为空时循环 front = (front + 1) % MAX; v = queue[front]; // 出队一个节点 p = G->adjlist[v].firstarc; while (p != NULL) { if (visited[p->adjvex] == 0) { // 若节点未被访问,则标记为已访问并入队 visited[p->adjvex] = 1; printf("%d ", p->adjvex); rear = (rear + 1) % MAX; queue[rear] = p->adjvex; } p = p->nextarc; } } } // 广度优先遍历入口函数 void BFSTraverse(AdjGraph *G) { int i; for (i = 0; i < G->n; i++) { visited[i] = 0; // 初始化visited数组 } for (i = 0; i < G->n; i++) { if (visited[i] == 0) { // 若节点未被访问,则从该节点开始进行广度优先遍历 BFS(G, i); } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

康雨城

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值